package Day_0220.Redis;

/**
 * @author zxc
 * @date 2023/02/20 12:09
 **/
public class Redis_Concurrent_Competition_Problem {
    public static void main(String[] args) {
        /**
         * Redis的并发竞争问题 && Redis事务的CAS方案
         * ===》
         * 1.Redis中的并发竞争问题 ：
         * 即，多个客户端对于同一个key中数据进行修改操作，会出现异常修改问题;
         * ===》
         * 一般来说，为解决并发问题，则会使用同步处理机制，就是给某些操作上锁（乐观锁/悲观锁）;
         *
         * 2.Optimistic locking using check-and-set(乐观锁)
         * ===》
         * 乐观锁，并不是真正地给某个操作进行上锁，而是比较某个事务前后，所要修改操作的数据是否被其他客户端进行修改过;
         * 若是被其他客户端在本事务执行过程中，修改的话，则在本事务中的所有操作都会失效;
         *
         * 1）乐观锁介绍：
         * （1）watch指令，在redis事务中，提供了CAS原子性行为。
         * （2）为了检测被watch的keys，是否有多个clients同时对其进行修改引起冲突，这些keys将会被监控。
         * （3）如果至少有一个被监控的key，在执行exec命令前被修改，整个事物将会回滚，不执行任何动作，
         *  从而保证原子性操作，并且执行exec会得到null的回复。
         *
         * 2）乐观锁工作机制：
         * （1）watch 命令会监视给定的每一个key，当exec时如果监视的任一个key
         * （2）自从调用watch后发生过变化，则整个事务会回滚，不执行任何动作。
         * （3）watch的key是对整个连接有效的，事务也一样。如果连接断开，监视和事务都会被自动清除。
         * （4）当然exec（事务执行），discard（事务回滚），unwatch（解除监视），及客户端连接关闭，都会清除连接中的所有监视。
         * （5）还有，如果watch一个不稳定(有生命周期)的key并且此key自然过期，exec仍然会执行事务队列的指令。
         *
         * ===》
         * 即，在Redis中，实现乐观锁的原理，就是 使用watch命令监视某些key，在事务开启前后，判断所监视的key是否发生变化;
         * watch命令所监视的key，在exec，discard，unwatch以及客户端连接关闭等命令操作之下，会被清除;
         *
         * 3）redis的Watch机制
         * （1）Redis Watch 命令用于监视一个(或多个) key ，
         *  如果在事务执行之前这个(或这些) key 被其他命令所改动，那么事务将被打断。
         * （2）注意 ：使用multi 开始事务，exec 提交事务。
         *  语法， redis Watch 命令基本语法如下：
         *  WATCH key [key …]
         *
         *
         * ====》
         * 总结 ：
         * 为解决Redis中的并发竞争问题，即Redis采用乐观锁机制;
         * （即，保证在redis开启事务前所监视的key，在事务结束后，未被其他客户端进行修改;）
         * ===》
         * （1）即，multi命令能够开启redis中的事务;
         * （2）在multi命令之前，采用watch命令，去监视某些key，保证其在redis事务开启前后，key所对应的value并未发生变化;
         * （3）注意 ：watch命令所监视的key，只能够通过exec（事务执行），discard（事务回滚）以及unwatch（解除监视）
         *  来解除对于key的监视;
         *
         *
         */
    }
}
